package eMdP.estats;

import java.net.URL;
import java.util.LinkedList;

import com.jmex.bui.BButton;
import com.jmex.bui.BComponent;
import com.jmex.bui.BContainer;
import com.jmex.bui.BImage;
import com.jmex.bui.BLabel;
import com.jmex.bui.BToggleButton;
import com.jmex.bui.background.ImageBackground;
import com.jmex.bui.enumeratedConstants.ImageBackgroundMode;
import com.jmex.bui.event.ActionEvent;
import com.jmex.bui.event.ActionListener;
import com.jmex.bui.util.Point;

import eMdP.gestors.GestorConstants;
import eMdP.gestors.GestorFitxers;
import eMdP.gestors.GestorPantalla;

public class MenuIniciarPartidaUnJugador extends GbuiGameState {
	
	private BButton boto;
	private BLabel text;
	private BContainer contenidor;
	private BToggleButton toggle;
	private int idPantalla;
	private int idPlayer;
	private int mode;
	
	public MenuIniciarPartidaUnJugador (String name)
	{
		super(name);
		System.out.println("Entro a menú d'iniciar partida amb un sol jugador");

    	window.setSize((int)(display.getWidth()),(int)(display.getHeight()));
    	
 		int posicioY = display.getHeight()-GestorConstants.ALT_BOTO;
    	
    	text = new BLabel("Inicia partida d'un sol jugador");
    	text.setPreferredSize(window.getWidth(), GestorConstants.ALT_BOTO);
    	window.add(text, new Point(0, posicioY));
    	
		posicioY = posicioY-GestorConstants.PIXELS_IMATGE_PANTALLA-GestorConstants.ESPAI_ENTRE_ELEMENTS_GBUI;
    	
		posicioY = creaMenuPantalles(posicioY);
    	
    	posicioY = crearMenuPersonatge(posicioY);
    	
    	posicioY = crearMenuModalitat(posicioY);
    	
    	int posicioX = display.getWidth()/2-210;
 		// Botó de cancelar
 		boto = new BButton("Torna");
 		boto.setPreferredSize(GestorConstants.BOTO_200_PX, GestorConstants.ALT_BOTO);
 		boto.addListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				// Canviem estat actual per el menú d'inici
				GestorPantalla.canvia(3,0);
			}
        });
        window.add(boto, new Point(posicioX, 20));
        
        posicioX = display.getWidth()/2+GestorConstants.ESPAI_ENTRE_ELEMENTS_GBUI;
        
        // Botó per a iniciar partida
        boto = new BButton("Juga!");
        boto.setPreferredSize(GestorConstants.BOTO_200_PX, GestorConstants.ALT_BOTO);
 		boto.addListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				// Cridem al gestor de pantalla per a iniciar la partida i el canvi d'estats
				GestorPantalla.iniciaPartida(idPlayer, idPantalla, mode);
			}
        });
        window.add(boto, new Point(posicioX, 20));
        
	}
	
	private int creaMenuPantalles(int posicioY)
	{
		// Agafem el nom dels escenaris en format array d'Strings
		String[] noms = getNomsPantalles();
		// Agafem els escenaris de les pantalles
		BImage[] imatges = getImatgesPantalles(noms);
    	
		// Comencem per l'escenariamb id=0
    	idPantalla = 0;
    	
    	// Creem un "contenidor" que mostrarà la imatge de fons
    	contenidor = new BContainer("Imatge pantalla");
		contenidor.setBackground(BComponent.DEFAULT, new ImageBackground(ImageBackgroundMode.SCALE_XY, imatges[idPantalla]));
		contenidor.setPreferredSize(GestorConstants.PIXELS_IMATGE_PANTALLA, GestorConstants.PIXELS_IMATGE_PANTALLA);
		// Com que és un contenidor genèric, té habilitat el "hover", per tant el deshabilitem
		contenidor.setHoverEnabled(false);
		window.add(contenidor, new Point(display.getWidth()/2-GestorConstants.PIXELS_IMATGE_PANTALLA/2,posicioY));
		
		// Actualitzem la posició Y per sota per a posar-hi el nom
		posicioY = posicioY - GestorConstants.ALT_BOTO;
		
		// Hi posem el nom
		text = new BLabel(noms[0]);
		text.setPreferredSize(GestorConstants.PIXELS_IMATGE_PANTALLA, GestorConstants.ALT_BOTO);
    	window.add(text, new Point(display.getWidth()/2-GestorConstants.PIXELS_IMATGE_PANTALLA/2, posicioY));
    	
    	posaBotonsAbansDespres(posicioY+GestorConstants.ALT_BOTO, 0);
    	
    	return posicioY-GestorConstants.PIXELS_IMATGE_PANTALLA-GestorConstants.ESPAI_ENTRE_ELEMENTS_GBUI;
	}
	
	private int crearMenuPersonatge(int posicioY)
	{
		String[] noms = getNomsPersonatges(false);
		BImage[] imatges = getImatgesPersonatges(noms, false);
    	
    	idPlayer = 0;
    	
    	contenidor = new BContainer("Imatge personatge");
		contenidor.setBackground(BComponent.DEFAULT, new ImageBackground(ImageBackgroundMode.SCALE_XY, imatges[idPlayer]));
		contenidor.setPreferredSize(GestorConstants.PIXELS_IMATGE_PANTALLA, GestorConstants.PIXELS_IMATGE_PANTALLA);
		contenidor.setHoverEnabled(false);
		window.add(contenidor, new Point(display.getWidth()/2-GestorConstants.PIXELS_IMATGE_PANTALLA/2,posicioY));
		
		posicioY = posicioY - GestorConstants.ALT_BOTO;
		
		text = new BLabel(noms[0]);
		text.setPreferredSize(GestorConstants.PIXELS_IMATGE_PANTALLA, GestorConstants.ALT_BOTO);
    	window.add(text, new Point(display.getWidth()/2-GestorConstants.PIXELS_IMATGE_PANTALLA/2, posicioY));
    	
    	posaBotonsAbansDespres(posicioY+GestorConstants.ALT_BOTO, 1);
    	
    	return posicioY-GestorConstants.ALT_BOTO-GestorConstants.ESPAI_ENTRE_ELEMENTS_GBUI;
	}
	
	private int crearMenuModalitat(int posicioY)
	{
		text = new BLabel("Escull la modalitat de joc");
    	text.setPreferredSize(window.getWidth(), GestorConstants.ALT_BOTO);
    	window.add(text, new Point(0, posicioY));
 		
    	posicioY = posicioY - GestorConstants.ALT_BOTO;
    	
    	mode = GestorConstants.MODE_TEMPS; // Mode = 1 vol dir paquets
    	// Creem el boto per temps
    	toggle = new BToggleButton("Per temps");
    	toggle.setPreferredSize(150,GestorConstants.ALT_BOTO);
    	toggle.setSelected(true);
    	// Afegim Listener que ens diu si esta seleccionat o no, ho apliquem al boto i a mes actualitzem la variable mode
    	toggle.addListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				boolean selected = ((BToggleButton)window.getComponent(10)).getState() == 3;
				((BToggleButton)window.getComponent(11)).setSelected(selected);
				if(selected)
					mode = GestorConstants.MODE_PAQUETS;
				else
					mode = GestorConstants.MODE_TEMPS;
			}
        });
    	// Afegim el boto a la finestra
    	window.add(toggle, new Point(display.getWidth()/2-160,posicioY));
    	toggle = new BToggleButton("Per paquets");
    	toggle.setPreferredSize(150,GestorConstants.ALT_BOTO);
    	toggle.setSelected(false);
    	toggle.addListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				boolean selected = ((BToggleButton)window.getComponent(11)).getState() == 3;
				((BToggleButton)window.getComponent(10)).setSelected(selected);
				if(selected)
					mode = GestorConstants.MODE_TEMPS;
				else
					mode = GestorConstants.MODE_PAQUETS;
			}
        });
    	window.add(toggle, new Point(display.getWidth()/2+10,posicioY));
    	
    	return posicioY;
	}

	
	private void posaBotonsAbansDespres(int posicioY, int id)
	{
		BButton botoTmp = new BButton("");
		botoTmp.setPreferredSize(44, 44);
		botoTmp.setStyleClass("anterior");
		if(id==0)
		{
			botoTmp.addListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent event) {
					String[] nomPantalles = getNomsPantalles();
					BImage[] imatges = getImatgesPantalles(nomPantalles);
					
					System.out.println("Pantalla anterior");
					idPantalla--;
					if(idPantalla<0)
						idPantalla = nomPantalles.length-1;
					window.getComponent(1).setBackground(BComponent.DEFAULT, 
							new ImageBackground(ImageBackgroundMode.CENTER_XY, imatges[idPantalla]));
					((BLabel)window.getComponent(2)).setText(nomPantalles[idPantalla]);
					
				}
	        });
		}
		else
		{
			botoTmp.addListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent event) {
					String[] noms = getNomsPersonatges(false);
					BImage[] imatges = getImatgesPersonatges(noms, false);
					System.out.println("Pantalla anterior");
					idPlayer--;
					if(idPlayer<0)
						idPlayer = noms.length-1;
					window.getComponent(5).setBackground(BComponent.DEFAULT, 
							new ImageBackground(ImageBackgroundMode.SCALE_XY, imatges[idPlayer]));
					((BLabel)window.getComponent(6)).setText(noms[idPlayer]);
					
				}
	        });
		}
		
		window.add(botoTmp, new Point(display.getWidth()/2-128, posicioY+42));
		
		botoTmp = new BButton("");
		botoTmp.setPreferredSize(44, 44);
		botoTmp.setStyleClass("seguent");
		window.add(botoTmp, new Point(display.getWidth()/2+84, posicioY+42));
		if(id == 0)
		{
			botoTmp.addListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent event) {
					System.out.println("Pantalla seguent");
					String[] nomPantalles = getNomsPantalles();
					BImage[] imatges = getImatgesPantalles(nomPantalles);
					idPantalla++;
					idPantalla=idPantalla%nomPantalles.length;
					window.getComponent(1).setBackground(BComponent.DEFAULT, 
							new ImageBackground(ImageBackgroundMode.SCALE_XY, imatges[idPantalla]));
					((BLabel)window.getComponent(2)).setText(nomPantalles[idPantalla]);
				}
	        });
		}
		else
		{
			botoTmp.addListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent event) {
					System.out.println("Pantalla seguent");
					String[] noms = getNomsPersonatges(false);
					BImage[] imatges = getImatgesPersonatges(noms, false);
					idPlayer++;
					idPlayer=idPlayer%noms.length;
					window.getComponent(5).setBackground(BComponent.DEFAULT, 
							new ImageBackground(ImageBackgroundMode.SCALE_XY, imatges[idPlayer]));
					((BLabel)window.getComponent(6)).setText(noms[idPlayer]);
				}
	        });
		}
	}

}
